package thread;

/**
 * 静态方法如果使用synchronized后，那么该方法一定具有同步效果
 */
public class SyncDemo3 {
    public static void main(String[] args) {
        Boo b1 = new Boo();
        Boo b2 = new Boo();
        Thread t1 = new Thread(()->b1.doSome());
        Thread t2 = new Thread(()->b2.doSome());

//        Thread t1 = new Thread(Boo::doSome);
//        Thread t2 = new Thread(Boo::doSome);
        t1.start();
        t2.start();
    }
}

class Boo{
    /*
        静态方法上使用synchronized时，同步监视器对象不可选，只能是当前类的类对象(Class实例)
        这里相当于是:Boo.class
        类对象会在后面反射知识点学习
        提示:在JVM内部，每个被加载的类都有且只有一个类对象与之绑定
     */
//    public synchronized static void doSome(){
    public static void doSome(){
        //静态方法中如果使用同步块，那么同步监视器对象仍然用当前类对象即可
        synchronized (Boo.class) {//类对象获取方式:类名.class
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + ":正在执行doSome方法...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(t.getName() + ":执行doSome方法完毕!");
        }
    }
}







